package demo1;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-11
 * Time: 10:50
 */

/**
 * 推导大O阶方法：去掉了那些对结果影响不大的项
 * 1.用常数1取代运行时间中的所有加法常数。
 * 2.在修改后的运行次数函数中，只保留最高阶项。
 * 3.如果最高阶项存在且不是1，则除去与这个项目相乘的常数。得到的结果就是大O阶。
 */
public class Test {
    //递归的时间复杂度 = 递归的次数 * 每次递归执行的次数
    //5. 计算斐波那契递归fibonacci的时间复杂度？-> 每次递归的执行的次数 1次
    //等比数列：2^n - 1 ：时间复杂度为：O(2^N)
    public static int fibonacci(int N) {
        return N < 2 ? N : fibonacci(N - 1) + fibonacci(N - 2);
    }
    public static void main(String[] args) {
        System.out.println(fibonacci(5));
    }
    //3. 计算阶乘递归factorial的时间复杂度？ -> 递归的执行次数 为1次 递归的次数为 n-1次（从N-1 到 1）
    public static long factorial(int N) {
        return N < 2 ? N : factorial(N - 1) * N;
    }
    public static void main3(String[] args) {
        System.out.println(factorial(5));
    }
    //2. 计算binarySearch的时间复杂度？ -> 1/2、1/4、1/8…… -> n / 2^x
    //知道n / 2^x = 1 ，找的只剩一个数 求出x = ？ 就行来了
    public static int binarySearch(int[] array, int key) {
        int left = 0;
        int right = array.length - 1;
        while(left < right) {
            int mid = (left + right) / 2;
            if(array[mid] < key) {
                left = mid + 1;
            }
            if(array[mid] > key) {
                right = mid - 1;
            }
            if(array[mid] == key) {
                return mid;
            }
        }
        return -1;
    }
    public static void main2(String[] args) {
        int[] array = {2, 4, 6, 7, 8, 9, 10};
        System.out.println(binarySearch(array, 4));
    }
    //1. 计算bubbleSort的时间复杂度？ -> n-1、n-2、n-3、n-4……2、1 等差数列
    //求Sn = na1 + (n*(n-1) / 2)*d = 1/2*n^2 -> 根据推导大O阶方法，结果为：n^2

    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            boolean sorts = false;
            for (int j = 0; j < array.length - 1 - i; j++) {
                if(array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    sorts = true;
                }
            }
            if(sorts == false) {
                break;
            }
        }
    }
    public static void main1(String[] args) {
        int[] array = {1, 2, 4, 5, 3, 6, 9, 0, 19};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }
}
